package filter

import (
	"fmt"
	"github.com/beego/beego/v2/server/web/context"
	"ksd-social-api/commons/global"
	"ksd-social-api/commons/jwttoken"
	R "ksd-social-api/commons/result"
	"ksd-social-api/utils/rdb"
)

func LoginFilter(ctx *context.Context) {
	global.SugarLog.Infof("2: 拦截器 %s 进来了...", "LoginFilter")
	Token := ctx.Request.Header["Authorization"]
	Uuid := ctx.Request.Header["Uuid"]
	if len(Token) == 0 || len(Uuid) == 0 {
		ctx.Output.JSON(R.FailCodeMsg(60001, "请携带token进行访问"), true, true)
		return
	}

	// 判断当前的token是不是在redis的黑名单中，如果是就直接返回 ---退出 ---7
	cacheKey := fmt.Sprintf("LOGINOUT:%s", Uuid[0])
	cacheUuid, _ := rdb.RdbGet(cacheKey)
	if cacheUuid == Uuid[0] {
		// 如果过期了就直接返回，token失效
		ctx.Output.JSON(R.FailCodeMsg(60001, "请重新登录!"), true, true)
		return
	}

	// 创建jwt
	jwt := jwttoken.NewJWT()
	// 开始解析用户传递进来的token，是否过期
	customClaims, err := jwt.ParserToken(Token[0])
	if err != nil {
		// 如果过期了就直接返回，token失效
		ctx.Output.JSON(R.FailCodeMsg(60001, "Token已经失效，请重新登录"), true, true)
		return
	}

	// 如果没有。就获取用户信息，下放到路由处理方法中，这样给后续需要用户信息的地方可以直接获取
	ctx.Input.SetData("userId", customClaims.UserId)
	ctx.Input.SetData("uuid", Uuid[0])
	ctx.Input.SetData("userName", customClaims.Username)
	ctx.Input.SetData("avatar", customClaims.Avatar)
}
